package com.company.ThreadsCommunication;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 作者：13687
 * 日期：2017/6/5
 * 项目：ThreadPoolsDemo
 * 描述: 共享变量
 */
public class NumberLockHolder {
	private int number;

	private Lock lock = new ReentrantLock();// 可重入锁
	private Condition condition = lock.newCondition();//条件
	public void increase() {
		/**
		 * 1. 对数据操作前 需要加锁
		 *
		 * */
		lock.lock();

		try {
//			如果是0的话就 释放锁挂起 然后就可以等待通知(number 变0后)了
			if (0!=number){
				condition.await();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
//		number = 0
		number++;
		System.out.println(number);
		condition.signal();//通知等待中的线程(number 已经变1了)
	}

	public  void decrease() {
         lock.lock();
         try {
//         	如果为0 将进入等待
	         if (number==0){
		         lock.wait();
	         }
         } catch (InterruptedException e) {
	         e.printStackTrace();
         }finally {
         	lock.unlock();
         }
//         number不为0 的情况
		number--;
		System.out.println(number);
//		number 为0了 通知加线程来操作
		condition.signal();
	}
}
